#include "si12_iic.h"

volatile int si12tch_Timeout;

/*
*********************************************************************************************************
*	函 数 名: si12tch_i2c_Delay
*	功能说明: 时序延迟
*	形    参：无
*	返 回 值: 无
*********************************************************************************************************
*/
void si12tch_i2c_Delay(void)
{
	delay_us(2);
}

/*
*********************************************************************************************************
*	函 数 名: si12tch_iic_Init
*	功能说明: iic初始化
*	形    参：无
*	返 回 值: 无
*********************************************************************************************************
*/

void si12tch_iic_Init(void)
{
	//初始化GPIOB_6\7
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	si12tch_i2c_Stop();
}

/*********************************************************************************************************
*	函 数 名: si12tch_i2c_Start
*	功能说明: IIC起始信号
*	形    参：无
*	返 回 值: 无
*********************************************************************************************************
*/
void si12tch_i2c_Start(void)
{
	si12tch_iic_sda(1);
	SI12_SDA_SET;
	SI12_SCL_SET;
	si12tch_i2c_Delay();
	SI12_SDA_RESET;
	si12tch_i2c_Delay();
	SI12_SCL_RESET;//钳住I2C总线，准备发送或接收数据
}

/*
*********************************************************************************************************
*	函 数 名: si12tch_i2c_Stop
*	功能说明: IIC停止信号
*	形    参：无
*	返 回 值: 无
*********************************************************************************************************
*/
void si12tch_i2c_Stop(void)
{

	si12tch_iic_sda(1);
	SI12_SDA_RESET;
	SI12_SCL_RESET;
	si12tch_i2c_Delay();
	SI12_SCL_SET;
	SI12_SDA_SET;//发送I2C总线结束信号
	si12tch_i2c_Delay();
}

/*
*********************************************************************************************************
*	函 数 名: si12tch_i2c_WaitAck
*	功能说明: 等待返回ack
*	形    参：无
*	返 回 值: 返回0表示正确应答，1表示无器件响应
*********************************************************************************************************
*/
unsigned char si12tch_i2c_WaitAck(void)
{
	si12tch_iic_sda(0);
	SI12_SDA_RESET;
	si12tch_i2c_Delay();
	SI12_SCL_SET;
	si12tch_i2c_Delay();
	si12tch_Timeout = SI12TCH_LONG_TIMEOUT;
	while(SI12TCH_I2C_SDA_READ())
	{
		if(--si12tch_Timeout == 0)
        {
            si12tch_i2c_Stop();
            return 1;
        }
	}
	SI12_SCL_RESET;
	return 0; 
}

/*
*********************************************************************************************************
*	函 数 名: si12tch_i2c_Ack
*	功能说明: 产生ACK应答
*	形    参：无
*	返 回 值: 无
*********************************************************************************************************
*/
void si12tch_i2c_Ack(void)
{
	SI12_SCL_RESET;	
	si12tch_iic_sda(1);
	SI12_SDA_RESET;
	si12tch_i2c_Delay();
	SI12_SCL_SET;	
	si12tch_i2c_Delay();
	SI12_SCL_RESET;	
}


/*
*********************************************************************************************************
*	函 数 名: si12tch_i2c_NAck
*	功能说明: CPU产生1个NACK信号
*	形    参：无
*	返 回 值: 无
*********************************************************************************************************
*/
void si12tch_i2c_NAck(void)
{
	SI12_SCL_RESET;	
	si12tch_iic_sda(1);
	SI12_SDA_SET;
	si12tch_i2c_Delay();
	SI12_SCL_SET;
	si12tch_i2c_Delay();
	SI12_SCL_RESET;;
}

/*
*********************************************************************************************************
*	函 数 名: si12tch_i2c_SendByte
*	功能说明: 发送一个字节
*	形    参：发送的数据
*	返 回 值: 无
*********************************************************************************************************
*/
void si12tch_i2c_SendByte(unsigned char _ucByte)
{
	unsigned char i;
	si12tch_iic_sda(1);
  SI12_SCL_RESET;//拉低时钟开始数据传输
  for(i=0; i<8; i++)
  {              
		if((_ucByte&0x80)>>7)
		{
			SI12_SDA_SET;
		}
		else
		{
			SI12_SDA_RESET;
		}
		_ucByte<<=1; 	     
		si12tch_i2c_Delay();
		SI12_SCL_SET;
		si12tch_i2c_Delay();
		SI12_SCL_RESET;
		si12tch_i2c_Delay();
  }
}

/*
*********************************************************************************************************
*	函 数 名: si12tch_i2c_ReadByte
*	功能说明: 读取一个字节
*	形    参：无
*	返 回 值: 所读取字节
*********************************************************************************************************
*/

unsigned char si12tch_i2c_ReadByte(uint8_t ack)
{
	unsigned char i;
	unsigned char value=0;
//	SI12TCH_I2C_SDA_IN();
	si12tch_iic_sda(0);
	for(i=0;i<8;i++ )
	{
		SI12_SCL_RESET;
		si12tch_i2c_Delay();
		SI12_SCL_SET;
		value<<=1;
		if(SI12TCH_I2C_SDA_READ())
		{
			value++;
		}   
		si12tch_i2c_Delay();
	}
	if(!ack)
		si12tch_i2c_NAck();
	else
		si12tch_i2c_Ack();
	return value;
}

void si12tch_iic_sda(uint8_t mode)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	if(mode == 0)
	{
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	}
	else
	{
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	}	

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}
